/*
    开始时间：2024/3/6
    内容：进程信号的学习--》信号捕捉的测试
    作者：剑痴
    结束时间：2024/3/6
*/
#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <string.h>
using namespace std;
void printBlock(sigset_t* p)
{
    cout<<getpid()<<"->当前进程的信号集：";
    for(int i = 1;i <= 31;i++)
    {
        if(sigismember(p,i)) cout<<1;
        else cout<<0;
    }
    cout<<endl;
}
void handler(int sigo)
{
    cout<<"捕捉到信号:"<<sigo<<endl;
}
int main()
{

    signal(2,handler);
   //1.屏蔽2号信号
    //1.1初始化
    sigset_t set,oset;  //定义信号集
    sigemptyset(&set);
    sigemptyset(&oset);
    //1.2将2号信号添加到set中
    sigaddset(&set,2);
    // sigaddset(&set,3);
    // sigaddset(&set,9);
    //1.3将新的信号屏蔽字设置到当前进程
    //sigprocmask(SIG_BLOCK,&set,nullptr);
     sigprocmask(SIG_BLOCK,&set,&oset); //将原来信号屏蔽字保存在oset中
   //2.while获取当前进程的pending信号集
   int cnt = 0;
   while(true)
   {
    //2.1获取当前进程的信号集
      sigset_t pending;
      sigpending(&pending);
      //2.2打印出当前进程的信号集
      printBlock(&pending);
      //2.3休眠一秒
      sleep(1);
      if(cnt++ == 10)
      {
        cout<<"recover block"<<endl;
        sigprocmask(SIG_UNBLOCK,&set,nullptr);  //解除信号集屏蔽
      }
   }
   return 0;
}